/***************************************
* @file inmp441.c
* @brief 配置I2S实现inmp441输入，MAX98357输出
* @author 帖川云
* @date 2025年8月22日
* @version 1.0
* 版本: 作者, 日期, 描述
****************************************/
#include <stdio.h>
#include "max9857a.h"
#include "driver/i2s_std.h"
#include "esp_log.h"
#include "string.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_task_wdt.h"


/*I2S发送句柄*/
i2s_chan_handle_t tx_handle;

/*初始化I2S*/
void I2S_Init(void)
{
    /*分配新的I2S通道*/
    i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_1, I2S_ROLE_MASTER);
    // {
    //     .id = I2S_NUM_AUTO,             //自动找到可用的I2S通道
    //     .role = I2S_ROLE_MASTER,        //主机模式输出时钟BCLK
    //     .dma_desc_num = 6,              //DMA描述符数量
    //     .dma_frame_num = 240,           //DMA帧数量
    //     .auto_clear_after_cb = false,   //回调后自动清除标志
    //     .auto_clear_before_cb = false,  //回调前自动清除标志
    //     .allow_pd = false,              //允许省电
    //     .intr_priority = 0,             //自动分配较低的中断优先级
    // };
    
    ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle, NULL));
}

/*I2S通道配置*/
i2s_chan_handle_t * Max9875a_init(unsigned int sample_rate, unsigned int num_slot, unsigned int bit_width)
{
    printf("Max9875a初始化开始 %d   %d   %d\r\n", sample_rate, num_slot, bit_width);
    printf("&tx_handle = %p\r\n", &tx_handle);
    /*初始化I2S通道*/
    i2s_std_config_t std_cfg = {
        
        .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(sample_rate),
        // .sample_rate_hz = sample_rate,     //采样率
        // .clk_cfg.clk_src = I2S_CLK_SRC_DEFAULT, 
        // .clk_cfg.mclk_multiple = I2S_MCLK_MULTIPLE_256, 
        // .clk_cfg.bclk_div = 8, 

        .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(bit_width, num_slot),

        //.slot_cfg.data_bit_width = bit_width,                //数据位宽
        // .slot_cfg.slot_bit_width = I2S_SLOT_BIT_WIDTH_32BIT, //声道位宽
        // .slot_cfg.slot_mode = num_slot,                      //立体声模式（采用单声道也可以，但后期接收数据的处理不一样了就，具体看乐鑫官网的I2S接收）
        // .slot_cfg.slot_mask = I2S_STD_SLOT_BOTH,             //双声道（采用左右声道也可以，但后期接收数据的处理不一样了就）
        //.slot_cfg.ws_width = 1,                             //ws脉冲
        // .slot_cfg.ws_pol = false,                            //WS极性
        // .slot_cfg.bit_shift = true,                          //启用位移，PCM模式
        // .slot_cfg.msb_right = false,                          //MSB右对齐，PCM模式
        
        .gpio_cfg = {
                        .mclk = GPIO_NUM_NC,                        
                        .bclk = I2S_BCLK,                           
                        .ws = I2S_WS,                               
                        .dout = I2S_DATA_OUT,                       
                        .din = GPIO_NUM_NC,   
                        .invert_flags.bclk_inv = false,                      //不反转BCLK
                        .invert_flags.ws_inv = false,                        //不反转WS
                        .invert_flags.mclk_inv = false,                      //不反转DIN
                    },                      

    };
   
    ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle, &std_cfg));
    /* 在写入数据之前，先启用 TX 通道 */
    ESP_ERROR_CHECK(i2s_channel_enable(tx_handle)); 

    return &tx_handle;
}


